home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / mesa-1.2.8 / src-tk / shapes.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  12KB  |  458 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include "gltk.h"
  6. /*#include "private.h"*/
  7.  
  8. /******************************************************************************/
  9.  
  10. #ifndef PI
  11. #define PI 3.14159265358979323846
  12. #endif
  13.  
  14. /******************************************************************************/
  15.  
  16. void tkWireSphere(GLuint base, float radius)
  17. {
  18.     GLUquadricObj *quadObj;
  19.  
  20.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  21.     quadObj = gluNewQuadric();
  22.     gluQuadricDrawStyle(quadObj, GLU_LINE);
  23.     gluSphere(quadObj, radius, 16, 16);
  24.     glEndList();
  25. }
  26.  
  27. /******************************************************************************/
  28.  
  29. void tkSolidSphere(GLuint base, float radius)
  30. {
  31.     GLUquadricObj *quadObj;
  32.  
  33.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  34.     quadObj = gluNewQuadric();
  35.     gluQuadricDrawStyle(quadObj, GLU_FILL);
  36.     gluQuadricNormals(quadObj, GLU_SMOOTH);
  37.     gluSphere(quadObj, radius, 16, 16);
  38.     glEndList();
  39. }
  40.  
  41. /******************************************************************************/
  42.  
  43. void tkWireCube(GLuint base, float size)
  44. {
  45.     static float n[6][3] = {
  46.     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  47.     {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}
  48.     };
  49.     static GLint faces[6][4] = {
  50.     {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  51.     {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3}
  52.     };
  53.     float x0, x1, y0, y1, z0, z1, tmp;
  54.     float v[8][3];
  55.     int i;
  56.  
  57.     x0 = -size / 2.0;
  58.     x1 = size / 2.0;
  59.     y0 = -size / 2.0;
  60.     y1 = size / 2.0;
  61.     z0 = -size / 2.0;
  62.     z1 = size / 2.0;
  63.  
  64.     if (x0 > x1) {
  65.     tmp = x0; x0 = x1; x1 = tmp;
  66.     }
  67.     if (y0 > y1) {
  68.     tmp = y0; y0 = y1; y1 = tmp; 
  69.     }
  70.     if (z0 > z1) {
  71.     tmp = z0; z0 = z1; z1 = tmp; 
  72.     }
  73.     v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0;
  74.     v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1;
  75.     v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
  76.     v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
  77.     v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0;
  78.     v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1;
  79.  
  80.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  81.     for (i = 0; i < 6; i++) {
  82.         glBegin(GL_LINE_LOOP);
  83.         glNormal3fv(&n[i][0]);
  84.         glVertex3fv(&v[faces[i][0]][0]);
  85.         glNormal3fv(&n[i][0]);
  86.         glVertex3fv(&v[faces[i][1]][0]);
  87.         glNormal3fv(&n[i][0]);
  88.         glVertex3fv(&v[faces[i][2]][0]);
  89.         glNormal3fv(&n[i][0]);
  90.         glVertex3fv(&v[faces[i][3]][0]);
  91.         glEnd();
  92.     }
  93.     glEndList();
  94. }
  95.  
  96. /******************************************************************************/
  97.  
  98. void tkSolidCube(GLuint base, float size)
  99. {
  100.     static float n[6][3] = {
  101.     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  102.     {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}
  103.     };
  104.     static GLint faces[6][4] = {
  105.     {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  106.     {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3}
  107.     };
  108.     float x0, x1, y0, y1, z0, z1, tmp;
  109.     float v[8][3];
  110.     int i;
  111.  
  112.     x0 = -size / 2.0;
  113.     x1 = size / 2.0;
  114.     y0 = -size / 2.0;
  115.     y1 = size / 2.0;
  116.     z0 = -size / 2.0;
  117.     z1 = size / 2.0;
  118.  
  119.     if (x0 > x1) {
  120.     tmp = x0; x0 = x1; x1 = tmp;
  121.     }
  122.     if (y0 > y1) {
  123.     tmp = y0; y0 = y1; y1 = tmp; 
  124.     }
  125.     if (z0 > z1) {
  126.     tmp = z0; z0 = z1; z1 = tmp; 
  127.     }
  128.     v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0;
  129.     v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1;
  130.     v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
  131.     v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
  132.     v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0;
  133.     v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1;
  134.  
  135.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  136.     for (i = 0; i < 6; i++) {
  137.         glBegin(GL_POLYGON);
  138.         glNormal3fv(&n[i][0]);
  139.         glVertex3fv(&v[faces[i][0]][0]);
  140.         glNormal3fv(&n[i][0]);
  141.         glVertex3fv(&v[faces[i][1]][0]);
  142.         glNormal3fv(&n[i][0]);
  143.         glVertex3fv(&v[faces[i][2]][0]);
  144.         glNormal3fv(&n[i][0]);
  145.         glVertex3fv(&v[faces[i][3]][0]);
  146.         glEnd();
  147.     }
  148.     glEndList();
  149. }
  150.  
  151. /******************************************************************************/
  152.  
  153. void tkWireBox(GLuint base, float width, float height, float depth)
  154. {
  155.     static float n[6][3] = {
  156.     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  157.     {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}
  158.     };
  159.     static GLint faces[6][4] = {
  160.     {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  161.     {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3}
  162.     };
  163.     float x0, x1, y0, y1, z0, z1, tmp;
  164.     float v[8][3];
  165.     int i;
  166.  
  167.     x0 = -width / 2.0;
  168.     x1 = width / 2.0;
  169.     y0 = -height / 2.0;
  170.     y1 = height / 2.0;
  171.     z0 = -depth / 2.0;
  172.     z1 = depth / 2.0;
  173.  
  174.     if (x0 > x1) {
  175.     tmp = x0; x0 = x1; x1 = tmp;
  176.     }
  177.     if (y0 > y1) {
  178.     tmp = y0; y0 = y1; y1 = tmp; 
  179.     }
  180.     if (z0 > z1) {
  181.     tmp = z0; z0 = z1; z1 = tmp; 
  182.     }
  183.     v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0;
  184.     v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1;
  185.     v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
  186.     v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
  187.     v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0;
  188.     v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1;
  189.  
  190.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  191.     for (i = 0; i < 6; i++) {
  192.         glBegin(GL_LINE_LOOP);
  193.         glNormal3fv(&n[i][0]);
  194.         glVertex3fv(&v[faces[i][0]][0]);
  195.         glNormal3fv(&n[i][0]);
  196.         glVertex3fv(&v[faces[i][1]][0]);
  197.         glNormal3fv(&n[i][0]);
  198.         glVertex3fv(&v[faces[i][2]][0]);
  199.         glNormal3fv(&n[i][0]);
  200.         glVertex3fv(&v[faces[i][3]][0]);
  201.         glEnd();
  202.     }
  203.     glEndList();
  204. }
  205.  
  206. /******************************************************************************/
  207.  
  208. void tkSolidBox(GLuint base, float width, float height, float depth)
  209. {
  210.     static float n[6][3] = {
  211.     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  212.     {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}
  213.     };
  214.     static GLint faces[6][4] = {
  215.     {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  216.     {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3}
  217.     };
  218.     float x0, x1, y0, y1, z0, z1, tmp;
  219.     float v[8][3];
  220.     int i;
  221.  
  222.     x0 = -width / 2.0;
  223.     x1 = width / 2.0;
  224.     y0 = -height / 2.0;
  225.     y1 = height / 2.0;
  226.     z0 = -depth / 2.0;
  227.     z1 = depth / 2.0;
  228.  
  229.     if (x0 > x1) {
  230.     tmp = x0; x0 = x1; x1 = tmp;
  231.     }
  232.     if (y0 > y1) {
  233.     tmp = y0; y0 = y1; y1 = tmp; 
  234.     }
  235.     if (z0 > z1) {
  236.     tmp = z0; z0 = z1; z1 = tmp; 
  237.     }
  238.     v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0;
  239.     v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1;
  240.     v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0;
  241.     v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1;
  242.     v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0;
  243.     v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1;
  244.  
  245.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  246.     for (i = 0; i < 6; i++) {
  247.         glBegin(GL_POLYGON);
  248.         glNormal3fv(&n[i][0]);
  249.         glVertex3fv(&v[faces[i][0]][0]);
  250.         glNormal3fv(&n[i][0]);
  251.         glVertex3fv(&v[faces[i][1]][0]);
  252.         glNormal3fv(&n[i][0]);
  253.         glVertex3fv(&v[faces[i][2]][0]);
  254.         glNormal3fv(&n[i][0]);
  255.         glVertex3fv(&v[faces[i][3]][0]);
  256.         glEnd();
  257.     }
  258.     glEndList();
  259. }
  260.  
  261. /******************************************************************************/
  262.  
  263. void tkWireTorus(GLuint base, float innerRadius, float outerRadius)
  264. {
  265.     GLint i, j;
  266.     float theta1, phi1, theta2, phi2, rings, sides;
  267.     float v0[03], v1[3], v2[3], v3[3];
  268.     float n0[3], n1[3], n2[3], n3[3];
  269.  
  270.     rings = 5;
  271.     sides = 10;
  272.  
  273.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  274.     for (i = 0; i < rings; i++) {
  275.     theta1 = (float)i * 2.0 * PI / rings;
  276.     theta2 = (float)(i + 1) * 2.0 * PI / rings;
  277.     for (j = 0; j < sides; j++) {
  278.         phi1 = (float)j * 2.0 * PI / sides;
  279.         phi2 = (float)(j + 1) * 2.0 * PI / sides;
  280.  
  281.         v0[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi1));
  282.         v0[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi1));
  283.         v0[2] = innerRadius * sin(phi1);
  284.  
  285.         v1[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi1));
  286.         v1[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi1));
  287.         v1[2] = innerRadius * sin(phi1);
  288.  
  289.         v2[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi2));
  290.         v2[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi2));
  291.         v2[2] = innerRadius * sin(phi2);
  292.  
  293.         v3[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi2));
  294.         v3[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi2));
  295.         v3[2] = innerRadius * sin(phi2);
  296.  
  297.         n0[0] = cos(theta1) * (cos(phi1));
  298.         n0[1] = -sin(theta1) * (cos(phi1));
  299.         n0[2] = sin(phi1);
  300.  
  301.         n1[0] = cos(theta2) * (cos(phi1));
  302.         n1[1] = -sin(theta2) * (cos(phi1));
  303.         n1[2] = sin(phi1);
  304.  
  305.         n2[0] = cos(theta2) * (cos(phi2));
  306.         n2[1] = -sin(theta2) * (cos(phi2));
  307.         n2[2] = sin(phi2);
  308.  
  309.         n3[0] = cos(theta1) * (cos(phi2));
  310.         n3[1] = -sin(theta1) * (cos(phi2));
  311.         n3[2] = sin(phi2);
  312.  
  313.         glBegin(GL_LINE_LOOP);
  314.         glNormal3fv(n3);
  315.         glVertex3fv(v3);
  316.         glNormal3fv(n2);
  317.         glVertex3fv(v2);
  318.         glNormal3fv(n1);
  319.         glVertex3fv(v1);
  320.         glNormal3fv(n0);
  321.         glVertex3fv(v0);
  322.         glEnd();
  323.     }
  324.     }
  325.     glEndList();
  326. }
  327.  
  328. /******************************************************************************/
  329.  
  330. void tkSolidTorus(GLuint base, float innerRadius, float outerRadius)
  331. {
  332.     GLint i, j;
  333.     float theta1, phi1, theta2, phi2, rings, sides;
  334.     float v0[03], v1[3], v2[3], v3[3];
  335.     float n0[3], n1[3], n2[3], n3[3];
  336.  
  337.     rings = 5;
  338.     sides = 10;
  339.  
  340.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  341.     for (i = 0; i < rings; i++) {
  342.     theta1 = (float)i * 2.0 * PI / rings;
  343.     theta2 = (float)(i + 1) * 2.0 * PI / rings;
  344.     for (j = 0; j < sides; j++) {
  345.         phi1 = (float)j * 2.0 * PI / sides;
  346.         phi2 = (float)(j + 1) * 2.0 * PI / sides;
  347.  
  348.         v0[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi1));
  349.         v0[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi1));
  350.         v0[2] = innerRadius * sin(phi1);
  351.  
  352.         v1[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi1));
  353.         v1[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi1));
  354.         v1[2] = innerRadius * sin(phi1);
  355.  
  356.         v2[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi2));
  357.         v2[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi2));
  358.         v2[2] = innerRadius * sin(phi2);
  359.  
  360.         v3[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi2));
  361.         v3[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi2));
  362.         v3[2] = innerRadius * sin(phi2);
  363.  
  364.         n0[0] = cos(theta1) * (cos(phi1));
  365.         n0[1] = -sin(theta1) * (cos(phi1));
  366.         n0[2] = sin(phi1);
  367.  
  368.         n1[0] = cos(theta2) * (cos(phi1));
  369.         n1[1] = -sin(theta2) * (cos(phi1));
  370.         n1[2] = sin(phi1);
  371.  
  372.         n2[0] = cos(theta2) * (cos(phi2));
  373.         n2[1] = -sin(theta2) * (cos(phi2));
  374.         n2[2] = sin(phi2);
  375.  
  376.         n3[0] = cos(theta1) * (cos(phi2));
  377.         n3[1] = -sin(theta1) * (cos(phi2));
  378.         n3[2] = sin(phi2);
  379.  
  380.         glBegin(GL_POLYGON);
  381.         glNormal3fv(n3);
  382.         glVertex3fv(v3);
  383.         glNormal3fv(n2);
  384.         glVertex3fv(v2);
  385.         glNormal3fv(n1);
  386.         glVertex3fv(v1);
  387.         glNormal3fv(n0);
  388.         glVertex3fv(v0);
  389.         glEnd();
  390.     }
  391.     }
  392.     glEndList();
  393. }
  394.  
  395. /******************************************************************************/
  396.  
  397. void tkWireCylinder(GLuint base, float radius, float height)
  398. {
  399.     GLUquadricObj *quadObj;
  400.  
  401.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  402.     glPushMatrix();
  403.     glRotatef(90.0, 1.0, 0.0, 0.0);
  404.     glTranslatef(0.0, 0.0, -1.0);
  405.     quadObj = gluNewQuadric();
  406.     gluQuadricDrawStyle(quadObj, GLU_LINE);
  407.     gluCylinder(quadObj, radius, radius, height, 12, 2);
  408.     glPopMatrix();
  409.     glEndList();
  410. }
  411.  
  412. /******************************************************************************/
  413.  
  414. void tkSolidCylinder(GLuint base, float radius, float height)
  415. {
  416.     GLUquadricObj *quadObj;
  417.  
  418.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  419.     glPushMatrix();
  420.     glRotatef(90.0, 1.0, 0.0, 0.0);
  421.     glTranslatef(0.0, 0.0, -1.0);
  422.     quadObj = gluNewQuadric();
  423.     gluQuadricDrawStyle(quadObj, GLU_FILL);
  424.     gluQuadricNormals(quadObj, GLU_SMOOTH);
  425.     gluCylinder(quadObj, radius, radius, height, 12, 2);
  426.     glPopMatrix();
  427.     glEndList();
  428. }
  429.  
  430. /******************************************************************************/
  431.  
  432. void tkWireCone(GLuint base, float b, float h)
  433. {
  434.     GLUquadricObj *quadObj;
  435.  
  436.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  437.     quadObj = gluNewQuadric();
  438.     gluQuadricDrawStyle(quadObj, GLU_LINE);
  439.     gluCylinder(quadObj, b, 0.0, h, 15, 10);
  440.     glEndList();
  441. }
  442.  
  443. /******************************************************************************/
  444.  
  445. void tkSolidCone(GLuint base, float b, float h)
  446. {
  447.     GLUquadricObj *quadObj;
  448.  
  449.     glNewList(base, GL_COMPILE_AND_EXECUTE);
  450.     quadObj = gluNewQuadric();
  451.     gluQuadricDrawStyle(quadObj, GLU_FILL);
  452.     gluQuadricNormals(quadObj, GLU_SMOOTH);
  453.     gluCylinder(quadObj, b, 0.0, h, 15, 10);
  454.     glEndList();
  455. }
  456.  
  457. /******************************************************************************/
  458.